package com.recipedb.sprint.controller;

import com.recipedb.sprint.security.JwtUtil;
import com.recipedb.sprint.service.LlmSessionService; // 仅调用接口，不修改实现
import com.recipedb.sprint.service.SessionsService;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;

import java.util.HashMap;
import java.util.Map;

@RestController
@RequestMapping("/api/expert") // 独立路径，与LlmSession的/api/llm/session区分
@RequiredArgsConstructor
public class SessionsController {

    private final SessionsService sessionsService; // 汽车专家自身服务
    private final LlmSessionService llmSessionService; // 复用LlmSession的服务接口
    private final JwtUtil jwtUtil;

    /**
     * E-01：用户询问汽车专业问题（如“什么是四驱”）
     */
    @PostMapping("/ask")
    public ResponseEntity<Map<String, Object>> askExpert(
            @RequestHeader("Authorization") String token,
            @RequestBody Map<String, Object> request) {

        try {
            // 1. 权限校验：仅登录用户可使用
            String pureToken = token.startsWith("Bearer ") ? token.substring(7) : token;
            String username = jwtUtil.validateToken(pureToken);
            if (username == null) {
                return ResponseEntity.status(401).body(Map.of("code", 401, "msg", "Token无效或已过期"));
            }

            // 2. 解析参数（简化：无需useSystemPrompt开关）
            Long userId = Long.valueOf(request.get("userId").toString());
            String question = (String) request.get("question"); // 普通对话输入
            String model = (String) request.getOrDefault("model", "deepseek"); // 可选，默认deepseek

            // 3. 调用汽车专家服务（固定不拼接、不落库）
            String tempKey = sessionsService.processQuestion(userId, question, model);

            // 4. 返回结果（明确告知普通对话模式）
            return ResponseEntity.ok(Map.of(
                    "code", 200,
                    "tempKey", tempKey,
                    "msg", "汽车专家普通对话已提交（不拼接提示词、不落库），正在生成回答..."
            ));

        } catch (Exception e) {
            return ResponseEntity.badRequest().body(Map.of("code", 500, "msg", e.getMessage()));
        }
    }

    /**
     * E-02：SSE流式输出LLM回答（无记录）
     */
    @GetMapping("/stream/{tempKey}")
    public SseEmitter streamAnswer(@PathVariable String tempKey) {
        SseEmitter emitter = new SseEmitter(0L); // 不超时
        sessionsService.streamAnswer(tempKey, emitter); // 调用自身服务处理流式输出
        return emitter;
    }
}